package main

import (
	"fmt"
	"strconv"
	"time"
)

/*
案例：
(1)在主线程（可以理解成进程）中，开启一个goroutine，该协程每隔1秒输出"hello,world"
(2)在主线程中也每隔一秒输出"hello,golang"，输出10次后，退出程序
(3)要求主线程和goroutine同时执行
*/
//编写函数，每隔1秒输出"hello,world"
func test() {
	for i := 1; i <= 10; i++ {
		fmt.Println("test() hello,world" + strconv.Itoa(i))
		time.Sleep(time.Second)
	}
}
func main() {
	//协程在这里for循环执行
	/*
		(1)如果主线程退出了，则协程即使还没有执行完毕，也会退出
		(2)当然协程也可以在主线程没有退出前，就自己结束了，比如完成了自己的任务
	*/
	go test()
	for i := 1; i <= 10; i++ {
		fmt.Println("test() hello,golang" + strconv.Itoa(i))
		time.Sleep(time.Second)
	}
}

/*
小结：
(1)主线程是一个物理线程，直接作用在cpu上的，是重量级的，非常耗费cpu资源
(2)协程从主线程开启的，是轻量级的线程，是逻辑态，对资源消耗相对小
(3)go的协程机制是重要的特点，可以轻松的开启上万个协程。其它编程语言的并发机制是一般基于线程的，开启过多的线程，资源耗费大，这里就凸显了go在并发上的优势了
*/
